route.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import { NextRequest, NextResponse } from 'next/server';
  2. import { prisma } from '@/lib/prisma';
  3. export async function GET(
  4. request: NextRequest,
  5. { params }: { params: Promise<{ id: string }> }
  6. ) {
  7. try {
  8. const { id } = await params;
  9. const importId = parseInt(id);
  10. if (isNaN(importId)) {
  11. return NextResponse.json(
  12. { error: 'Invalid import ID' },
  13. { status: 400 }
  14. );
  15. }
  16. // Check if import exists
  17. const importRecord = await prisma.import.findUnique({
  18. where: { id: importId }
  19. });
  20. if (!importRecord) {
  21. return NextResponse.json(
  22. { error: 'Import not found' },
  23. { status: 404 }
  24. );
  25. }
  26. // Get basic summary data
  27. const totalRecords = await prisma.cintasInstallCalendar.count({
  28. where: { importId }
  29. });
  30. const cintasSummaries = await prisma.cintasSummary.findMany({
  31. where: { importId },
  32. orderBy: { week: 'asc' }
  33. });
  34. // Get file info
  35. const file = importRecord.fileId ? await prisma.file.findUnique({
  36. where: { id: importRecord.fileId }
  37. }) : null;
  38. const summary = {
  39. totalRecords,
  40. totalWeeks: cintasSummaries.length,
  41. cintasSummaries: cintasSummaries.map((summary: any) => ({
  42. week: summary.week,
  43. trrTotal: summary.trrTotal,
  44. fourWkAverages: summary.fourWkAverages,
  45. trrPlus4Wk: summary.trrPlus4Wk,
  46. powerAdds: summary.powerAdds
  47. }))
  48. };
  49. return NextResponse.json({
  50. importId,
  51. fileName: file?.filename || 'Unknown',
  52. uploadDate: importRecord.createdAt,
  53. summary,
  54. summaryExists: cintasSummaries.length > 0
  55. });
  56. } catch (error) {
  57. console.error('Error fetching import summary:', error);
  58. return NextResponse.json(
  59. { error: 'Failed to fetch import summary' },
  60. { status: 500 }
  61. );
  62. }
  63. }
  64. export async function POST(
  65. request: NextRequest,
  66. { params }: { params: Promise<{ id: string }> }
  67. ) {
  68. try {
  69. const { id } = await params;
  70. const importId = parseInt(id);
  71. if (isNaN(importId)) {
  72. return NextResponse.json(
  73. { error: 'Invalid import ID' },
  74. { status: 400 }
  75. );
  76. }
  77. // Check if import exists
  78. const importRecord = await prisma.import.findUnique({
  79. where: { id: importId }
  80. });
  81. if (!importRecord) {
  82. return NextResponse.json(
  83. { error: 'Import not found' },
  84. { status: 404 }
  85. );
  86. }
  87. // Check if summary already exists
  88. const existingSummaries = await prisma.cintasSummary.count({
  89. where: { importId }
  90. });
  91. if (existingSummaries > 0) {
  92. // Return existing summary
  93. const cintasSummaries = await prisma.cintasSummary.findMany({
  94. where: { importId },
  95. orderBy: { weekId: 'desc' }
  96. });
  97. return NextResponse.json({
  98. importId,
  99. summaryGenerated: false,
  100. message: 'Summary already exists',
  101. summary: cintasSummaries.map((summary: any) => ({
  102. week: summary.week,
  103. trrTotal: summary.trrTotal,
  104. fourWkAverages: summary.fourWkAverages,
  105. trrPlus4Wk: summary.trrPlus4Wk,
  106. powerAdds: summary.powerAdds
  107. }))
  108. });
  109. }
  110. // Execute the stored procedure to generate summary
  111. await prisma.$executeRawUnsafe(
  112. `CALL cintas_calculate_summary(${importId})`
  113. );
  114. // Fetch the newly generated summary
  115. const cintasSummaries = await prisma.cintasSummary.findMany({
  116. where: { importId },
  117. orderBy: { weekId: 'desc' }
  118. });
  119. return NextResponse.json({
  120. importId,
  121. summaryGenerated: true,
  122. message: 'Summary generated successfully',
  123. summary: cintasSummaries.map((summary: any) => ({
  124. week: summary.week,
  125. trrTotal: summary.trrTotal,
  126. fourWkAverages: summary.fourWkAverages,
  127. trrPlus4Wk: summary.trrPlus4Wk,
  128. powerAdds: summary.powerAdds
  129. }))
  130. });
  131. } catch (error) {
  132. console.error('Error generating summary:', error);
  133. return NextResponse.json(
  134. { error: 'Failed to generate summary', details: error instanceof Error ? error.message : 'Unknown error' },
  135. { status: 500 }
  136. );
  137. }
  138. }